grammar Javacc;

LOOKAHEAD: 'LOOKAHEAD';
IGNORE_CASE: 'IGNORE_CASE';
PARSER_BEGIN: 'PARSER_BEGIN';
PARSER_END: 'PARSER_END';
JAVACODE: 'JAVACODE';
CPPCODE: 'CPPCODE';
TOKEN: 'TOKEN';
SPECIAL_TOKEN: 'SPECIAL_TOKEN';
MORE_: 'MORE';
SKIP_: 'SKIP';
TOKEN_MGR_DECLS: 'TOKEN_MGR_DECLS';
EOF_: 'EOF';
DCL_PARSER_BEGIN: 'DCL_PARSER_BEGIN';
DCL_PARSER_END: 'DCL_PARSER_END';
INC_PARSER_BEGIN: 'INC_PARSER_BEGIN';
INC_PARSER_END: 'INC_PARSER_END';
DEF_PARSER_BEGIN: 'DEF_PARSER_BEGIN';
DEF_PARSER_END: 'DEF_PARSER_END';

   
/* WHITE SPACE */
WS : (' '
| '\t'
| '\n'
| '\r'
| '\f'
| '/*@egen*/') -> channel(HIDDEN)
;

/* COMMENTS */
COMMENT:            '/*' .*? '*/'    -> channel(HIDDEN);
LINE_COMMENT:       '//' ~[\r\n]*    -> channel(HIDDEN);

ABSTRACT: 'abstract';
ASSERT: 'assert';
BOOLEAN: 'boolean';
BREAK: 'break';
BYTE: 'byte';
CASE: 'case';
CATCH: 'catch';
CHAR: 'char';
CLASS: 'class';
CONST: 'const';
CONTINUE: 'continue';
DEFAULT: 'default';
DO: 'do';
DOUBLE: 'double';
ELSE: 'else';
ENUM: 'enum';
EXTENDS: 'extends';
FALSE: 'false';
FINAL: 'final';
FINALLY: 'finally';
FLOAT: 'float';
FOR: 'for';
GOTO: 'goto';
IF: 'if';
IMPLEMENTS: 'implements';
IMPORT: 'import';
INSTANCEOF: 'instanceof';
INT: 'int';
INTERFACE: 'interface';
LONG: 'long';
NATIVE: 'native';
NEW: 'new';
NULL: 'null';
PACKAGE: 'package';
PRIVATE: 'private';
PROTECTED: 'protected';
PUBLIC: 'public';
RETURN: 'return';
SHORT: 'short';
STATIC: 'static';
STRICTFP: 'strictfp';
SUPER: 'super';
SWITCH: 'switch';
SYNCHRONIZED: 'synchronized';
THIS: 'this';
THROW: 'throw';
THROWS: 'throws';
TRANSIENT: 'transient';
TRUE: 'true';
TRY: 'try';
VOID: 'void';
VOLATILE: 'volatile';
WHILE: 'while';
TEMPLATE: 'template';
TYPENAME: 'typename';

INTEGER_LITERAL: DECIMAL_LITERAL [lL]? | HEX_LITERAL [lL]? | OCTAL_LITERAL [lL]? | BINARY_LITERAL [lL]?;

DECIMAL_LITERAL: [1-9] (('_')* [0-9])*;

HEX_LITERAL: '0' [xX] [0-9a-fA-F] (('_')* [0-9a-fA-F])*;

OCTAL_LITERAL: '0' (('_')* [0-7])*;

BINARY_LITERAL: '0' [bB] [01] (('_')* [01])*;

FLOATING_POINT_LITERAL: DECIMAL_FLOATING_POINT_LITERAL | HEXADECIMAL_FLOATING_POINT_LITERAL ;

DECIMAL_FLOATING_POINT_LITERAL: [0-9] (('_')* [0-9])* '.' ([0-9] (('_')* [0-9])*)? DECIMAL_EXPONENT? ([fFdD])? | '.' [0-9] (('_')* [0-9])* DECIMAL_EXPONENT? ([fFdD])? | [0-9] (('_')* [0-9])* DECIMAL_EXPONENT ([fFdD])? | [0-9] (('_')* [0-9])* DECIMAL_EXPONENT? [fFdD];

DECIMAL_EXPONENT: [eE] ([+-])? [0-9] (('_')* [0-9])*;

HEXADECIMAL_FLOATING_POINT_LITERAL: '0' [xX] [0-9a-fA-F] (('_')* [0-9a-fA-F])* ('.')? HEXADECIMAL_EXPONENT ([fFdD])? | '0' [xX] ([0-9a-fA-F] (('_')* [0-9a-fA-F])*)? '.' [0-9a-fA-F] (('_')* [0-9a-fA-F])* HEXADECIMAL_EXPONENT ([fFdD])?;

HEXADECIMAL_EXPONENT: [pP] ([+-])? [0-9] (('_')* [0-9])*;

CHARACTER_LITERAL: '\'' (~['\\\n\r] | '\\' ([ntbrf\\'"] | [0-7] [0-7]? | [0-3] [0-7] [0-7])) '\'';

STRING_LITERAL: '"'
   (
       ~["\\\n\r]
       | '\\'
            (
               [ntbrf\\'"]
               | 'u' [0-9a-fA-F] [0-9a-fA-F]? [0-9a-fA-F]? [0-9a-fA-F]?
               | [0-7]
               | [0-3][0-7][0-7]
            )
   )* '"';

/* SEPARATORS */
LPAREN: '(';
RPAREN: ')';
LBRACE: '{';
RBRACE: '}';
LBRACKET: '[';
RBRACKET: ']';
SEMICOLON: ';';
COMMA: ',';
DOT: '.';

   
ASSIGN: '=';
LT: '<';
BANG: '!';
TILDE: '~';
HOOK: '?';
COLON: ':';
DOUBLECOLON: '::';
EQ: '==';
LE: '<=';
GE: '>=';
NE: '!=';
SC_OR: '||';
SC_AND: '&&';
INCR: '++';
DECR: '--';
PLUS: '+';
MINUS: '-';
STAR: '*';
SLASH: '/';
BIT_AND: '&';
BIT_OR: '|';
XOR: '^';
REM: '%';
PLUSASSIGN: '+=';
MINUSASSIGN: '-=';
STARASSIGN: '*=';
SLASHASSIGN: '/=';
ANDASSIGN: '&=';
ORASSIGN: '|=';
XORASSIGN: '^=';
REMASSIGN: '%=';

//RUNSIGNEDSHIFT: '>>>';
runsignedshift : GT GT GT;
//RSIGNEDSHIFT: '>>';
rsignedshift: GT GT;
GT: '>';

IDENTIFIER: LETTER PART_LETTER*;

LETTER: [$A-Z_a-z\u00a2-\u00a5\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u021f\u0222-\u0233\u0250-\u02ad\u02b0-\u02b8\u02bb-\u02c1\u02d0-\u02d1\u02e0-\u02e4\u02ee\u037a\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03ce\u03d0-\u03d7\u03da-\u03f3\u0400-\u0481\u048c-\u04c4\u04c7-\u04c8\u04cb-\u04cc\u04d0-\u04f5\u04f8-\u04f9\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0621-\u063a\u0640-\u064a\u0671-\u06d3\u06d5\u06e5-\u06e6\u06fa-\u06fc\u0710\u0712-\u072c\u0780-\u07a5\u0905-\u0939\u093d\u0950\u0958-\u0961\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f3\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8b\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b36-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb5\u0bb7-\u0bb9\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c60-\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cde\u0ce0-\u0ce1\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d28\u0d2a-\u0d39\u0d60-\u0d61\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e3f-\u0e46\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edd\u0f00\u0f40-\u0f47\u0f49-\u0f6a\u0f88-\u0f8b\u1000-\u1021\u1023-\u1027\u1029-\u102a\u1050-\u1055\u10a0-\u10c5\u10d0-\u10f6\u1100-\u1159\u115f-\u11a2\u11a8-\u11f9\u1200-\u1206\u1208-\u1246\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1286\u1288\u128a-\u128d\u1290-\u12ae\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12ce\u12d0-\u12d6\u12d8-\u12ee\u12f0-\u130e\u1310\u1312-\u1315\u1318-\u131e\u1320-\u1346\u1348-\u135a\u13a0-\u13f4\u1401-\u166c\u166f-\u1676\u1681-\u169a\u16a0-\u16ea\u1780-\u17b3\u17db\u1820-\u1877\u1880-\u18a8\u1e00-\u1e9b\u1ea0-\u1ef9\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u207f\u20a0-\u20af\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2131\u2133-\u2139\u2160-\u2183\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303a\u3041-\u3094\u309d-\u309e\u30a1-\u30fe\u3105-\u312c\u3131-\u318e\u31a0-\u31b7\u3400-\u4db5\u4e00-\u9fa5\ua000-\ua48c\uac00-\ud7a3\uf900-\ufa2d\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe33-\ufe34\ufe4d-\ufe4f\ufe69\ufe70-\ufe72\ufe74\ufe76-\ufefc\uff04\uff21-\uff3a\uff3f\uff41-\uff5a\uff65-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\uffe0-\uffe1\uffe5-\uffe6] ;

PART_LETTER: [\u0000-\b\u000e-\u001b$0-9A-Z_a-z\u007f-\u009f\u00a2-\u00a5\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u021f\u0222-\u0233\u0250-\u02ad\u02b0-\u02b8\u02bb-\u02c1\u02d0-\u02d1\u02e0-\u02e4\u02ee\u0300-\u034e\u0360-\u0362\u037a\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03ce\u03d0-\u03d7\u03da-\u03f3\u0400-\u0481\u0483-\u0486\u048c-\u04c4\u04c7-\u04c8\u04cb-\u04cc\u04d0-\u04f5\u04f8-\u04f9\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05a1\u05a3-\u05b9\u05bb-\u05bd\u05bf\u05c1-\u05c2\u05c4\u05d0-\u05ea\u05f0-\u05f2\u0621-\u063a\u0640-\u0655\u0660-\u0669\u0670-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06ed\u06f0-\u06fc\u070f-\u072c\u0730-\u074a\u0780-\u07b0\u0901-\u0903\u0905-\u0939\u093c-\u094d\u0950-\u0954\u0958-\u0963\u0966-\u096f\u0981-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc\u09be-\u09c4\u09c7-\u09c8\u09cb-\u09cd\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f3\u0a02\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a59-\u0a5c\u0a5e\u0a66-\u0a74\u0a81-\u0a83\u0a85-\u0a8b\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b36-\u0b39\u0b3c-\u0b43\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b61\u0b66-\u0b6f\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb5\u0bb7-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be7-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c60-\u0c61\u0c66-\u0c6f\u0c82-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce1\u0ce6-\u0cef\u0d02-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d28\u0d2a-\u0d39\u0d3e-\u0d43\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d60-\u0d61\u0d66-\u0d6f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2-\u0df3\u0e01-\u0e3a\u0e3f-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edd\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6a\u0f71-\u0f84\u0f86-\u0f8b\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1021\u1023-\u1027\u1029-\u102a\u102c-\u1032\u1036-\u1039\u1040-\u1049\u1050-\u1059\u10a0-\u10c5\u10d0-\u10f6\u1100-\u1159\u115f-\u11a2\u11a8-\u11f9\u1200-\u1206\u1208-\u1246\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1286\u1288\u128a-\u128d\u1290-\u12ae\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12ce\u12d0-\u12d6\u12d8-\u12ee\u12f0-\u130e\u1310\u1312-\u1315\u1318-\u131e\u1320-\u1346\u1348-\u135a\u1369-\u1371\u13a0-\u13f4\u1401-\u166c\u166f-\u1676\u1681-\u169a\u16a0-\u16ea\u1780-\u17d3\u17db\u17e0-\u17e9\u180b-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18a9\u1e00-\u1e9b\u1ea0-\u1ef9\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c-\u200f\u202a-\u202e\u203f-\u2040\u206a-\u206f\u207f\u20a0-\u20af\u20d0-\u20dc\u20e1\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2131\u2133-\u2139\u2160-\u2183\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303a\u3041-\u3094\u3099-\u309a\u309d-\u309e\u30a1-\u30fe\u3105-\u312c\u3131-\u318e\u31a0-\u31b7\u3400-\u4db5\u4e00-\u9fa5\ua000-\ua48c\uac00-\ud7a3\uf900-\ufa2d\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe20-\ufe23\ufe33-\ufe34\ufe4d-\ufe4f\ufe69\ufe70-\ufe72\ufe74\ufe76-\ufefc\ufeff\uff04\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff65-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\uffe0-\uffe1\uffe5-\uffe6\ufff9-\ufffb] ;

javacc_input :	javacc_options 'PARSER_BEGIN' '(' identifier ')' compilationUnit 'PARSER_END' '(' identifier ')' production+ EOF;

javacc_options : ( IDENTIFIER '{' option_binding* '}' )? ;

option_binding : ( IDENTIFIER | 'LOOKAHEAD' | 'IGNORE_CASE' | 'static' | 'PARSER_BEGIN' ) '=' ( integerLiteral | booleanLiteral | stringLiteral | stringList ) ';' ;

stringList : '(' stringLiteral ( ',' stringLiteral )* ')' ;

production : javacode_production
 | cppcode_production
 | regular_expr_production
 | token_manager_decls
 | bnf_production
 ;

javacode_production : 'JAVACODE' resultType identifier formalParameters ( 'throws' name ( ',' name )* )? node_descriptor? block ;

cppcode_production : 'CPPCODE' accessModifier resultType identifier formalParameters ( 'throws' name ( ',' name )* )? block ;

bnf_production : resultType identifier formalParameters ( 'throws' name ( ',' name )* )? node_descriptor? ':' block '{' expansion_choices '}' ;

accessModifier : ( 'public' | 'protected' | 'private' )? ;

regular_expr_production : ( '<' '*' '>' | '<' IDENTIFIER ( ',' IDENTIFIER )* '>' )? regexpr_kind ( '[' 'IGNORE_CASE' ']' )? ':' '{' regexpr_spec ( '|' regexpr_spec )* '}' ;

token_manager_decls : 'TOKEN_MGR_DECLS' ':' ( classOrInterfaceBody )? ;

regexpr_kind : 'TOKEN'
|	'SPECIAL_TOKEN'
|	'SKIP'
|	'MORE'
;

regexpr_spec : regular_expression ( block )? ( ':' IDENTIFIER )? ;

expansion_choices : expansion ( '|' expansion )* ;

expansion : ( 'LOOKAHEAD' '(' local_lookahead ')' )? ( expansion_unit node_descriptor? )+ ;

local_lookahead : ( integerLiteral )? ( ',' )? ( expansion_choices )? ( ',' )? ( '{' ( expression )? '}' )? ;

expansion_unit : 'LOOKAHEAD' '(' local_lookahead ')'
|	block
|	'[' expansion_choices ']'
|	'try' '{' expansion_choices '}' ( 'catch' '(' ( name IDENTIFIER )? ')' block )* ( 'finally' block )?
|	( primaryExpression '=' )? ( identifier ( typeArguments )? arguments | regular_expression ( '.' IDENTIFIER )? )
|	'(' expansion_choices ')' ( '+' | '*' | '?' )?
;

regular_expression : stringLiteral
|	LT ( ( '#' )? identifier ':' )? complex_regular_expression_choices GT
|	'<' identifier '>'
|	'<' 'EOF' '>'
;

complex_regular_expression_choices : complex_regular_expression ( '|' complex_regular_expression )* ;

complex_regular_expression : ( complex_regular_expression_unit )+ ;

complex_regular_expression_unit : stringLiteral
|	'<' identifier '>'
|	character_list
|	'(' complex_regular_expression_choices ')' ( '+' | '*' | '?' | '{' integerLiteral ( ',' ( integerLiteral )? )? '}' )?
;

character_list : ( '~' )? '[' ( character_descriptor ( ',' character_descriptor )* )? ']' ;

character_descriptor : stringLiteral ( '-' stringLiteral )? ;

identifier : IDENTIFIER ;

node_descriptor : '#' ( IDENTIFIER | VOID )
  ( '(' '>'? node_descriptor_expression ')' )?
  ;

node_descriptor_expression
  : (~'(')*
  | '(' node_descriptor_expression ')'
  ;

javaIdentifier : ( IDENTIFIER | 'LOOKAHEAD' | 'IGNORE_CASE' | 'PARSER_BEGIN' | 'PARSER_END' | 'JAVACODE' | 'TOKEN' | 'SPECIAL_TOKEN' | 'MORE' | 'SKIP' | 'TOKEN_MGR_DECLS' | 'EOF' | 'template' | 'DCL_PARSER_BEGIN' | 'DCL_PARSER_END' | 'INC_PARSER_BEGIN' | 'INC_PARSER_END' | 'DEF_PARSER_BEGIN' | 'DEF_PARSER_END' )
;

compilationUnit : ( packageDeclaration )? ( importDeclaration )* ( typeDeclaration )* ;

packageDeclaration : modifiers 'package' name ';' ;

importDeclaration : 'import' ( 'static' )? name ( '.' '*' )? ';' ;

modifiers : ( ( 'public' | 'static' | 'protected' | 'private' | 'final' | 'abstract' | 'synchronized' | 'native' | 'transient' | 'volatile' | 'strictfp' | annotation ) )* ;

typeDeclaration : ';'
| modifiers ( classOrInterfaceDeclaration | enumDeclaration | annotationTypeDeclaration )
;

classOrInterfaceDeclaration : ( 'class' | 'interface' ) javaIdentifier typeParameters? extendsList? implementsList? classOrInterfaceBody ;

extendsList : 'extends' classOrInterfaceType ( ',' classOrInterfaceType )* ;

implementsList : 'implements' classOrInterfaceType ( ',' classOrInterfaceType )* ;

enumDeclaration : 'enum' javaIdentifier ( implementsList )? enumBody ;

enumBody : '{' ( enumConstant ( ',' enumConstant )* )? ( ',' )? ( ';' ( classOrInterfaceBodyDeclaration )* )? '}' ;

enumConstant : modifiers javaIdentifier arguments? classOrInterfaceBody? ;

typeParameters : '<' typeParameter ( ',' typeParameter )* '>' ;

typeParameter : javaIdentifier typeBound? ;

typeBound : 'extends' classOrInterfaceType ( '&' classOrInterfaceType )* ;

classOrInterfaceBody : '{' classOrInterfaceBodyDeclaration* '}' ;

classOrInterfaceBodyDeclaration : initializer
| modifiers ( classOrInterfaceDeclaration | enumDeclaration | constructorDeclaration | fieldDeclaration | methodDeclaration )
| ';'
;

fieldDeclaration : type variableDeclarator ( ',' variableDeclarator )* ';' ;

variableDeclarator : variableDeclaratorId ( '=' variableInitializer )? ;

variableDeclaratorId : javaIdentifier ( '[' ']' )* ;

variableInitializer : arrayInitializer
| expression
;

arrayInitializer : '{' ( variableInitializer ( ',' variableInitializer )* )? ( ',' )? '}' ;

methodDeclaration : typeParameters? resultType methodDeclarator ( 'throws' nameList )? ( block | ';' ) ;

methodDeclarator : javaIdentifier formalParameters ( '[' ']' )* ;

formalParameters : '(' ( formalParameter ( ',' formalParameter )* )? ')' ;

formalParameter : modifiers type ( ( '&' | '*' ) | '...' )? variableDeclaratorId ;

constructorDeclaration : typeParameters? javaIdentifier formalParameters ( 'throws' nameList )? '{' explicitConstructorInvocation? blockStatement* '}' ;

explicitConstructorInvocation : 'this' arguments ';'
| ( primaryExpression '.' )? 'super' arguments ';'
;

initializer : ( 'static' )? block ;

type : referenceType
| primitiveType
;

referenceType : primitiveType ( '[' ']' )+
|	( template? classOrInterfaceType ) ( '[' ']' )*
;

template : 'template' '<' templateBase ( ',' templateBase )* '>' ;

templateBase : templatePack '...'? IDENTIFIER ;

templatePack : 'class' | 'typename' ;

classOrInterfaceType : ( '::' )? IDENTIFIER typeArguments? ( ( '.' | '::' ) IDENTIFIER typeArguments? )* ;

typeArguments : '<' ( typeArgument ( ',' typeArgument ( '...' )? )* )? '>' ;

typeArgument : referenceType
|	'?' wildcardBounds?
;

wildcardBounds : 'extends' referenceType
|	'super' referenceType
;

primitiveType : 'boolean'
|	'char'
|	'byte'
|	'short'
|	'int'
|	'long'
|	'float'
|	'double'
;

resultType : ( 'void' ( '*' )? | ( 'const' )? type ( '*' | '&' )? ) ;

name : javaIdentifier ( '.' javaIdentifier )* ;

nameList : name ( ',' name )* ;

expression : conditionalExpression ( assignmentOperator expression )? ;

assignmentOperator : '='
|	'*='
|	'/='
|	'%='
|	'+='
|	'-='
|	'<<='
|	'>>='
|	'>>>='
|	'&='
|	'^='
|	'|='
;

conditionalExpression : conditionalOrExpression ( '?' expression ':' expression )? ;

conditionalOrExpression : conditionalAndExpression ( '||' conditionalAndExpression )* ;

conditionalAndExpression : inclusiveOrExpression ( '&&' inclusiveOrExpression )* ;

inclusiveOrExpression : exclusiveOrExpression ( '|' exclusiveOrExpression )* ;

exclusiveOrExpression : andExpression ( '^' andExpression )* ;

andExpression : equalityExpression ( '&' equalityExpression )* ;

equalityExpression : instanceOfExpression ( ( '==' | '!=' ) instanceOfExpression )* ;

instanceOfExpression : relationalExpression ( 'instanceof' type )? ;

relationalExpression : shiftExpression ( ( '<' | '>' | '<=' | '>=' ) shiftExpression )* ;

shiftExpression : additiveExpression ( ( '<<' | rsignedshift | runsignedshift ) additiveExpression )* ;

additiveExpression : multiplicativeExpression ( ( '+' | '-' ) multiplicativeExpression )* ;

multiplicativeExpression : unaryExpression ( ( '*' | '/' | '%' ) unaryExpression )* ;

unaryExpression : ( '+' | '-' ) unaryExpression
|	preIncrementExpression
|	preDecrementExpression
|	unaryExpressionNotPlusMinus
;

preIncrementExpression : '++' primaryExpression ;

preDecrementExpression : '--' primaryExpression ;

unaryExpressionNotPlusMinus : ( '~' | '!' ) unaryExpression
|	castExpression
|	postfixExpression
;

castLookahead : '(' primitiveType
|	'(' type '[' ']'
|	'(' type ')' ( '~' | '!' | '(' | javaIdentifier | 'this' | 'super' | 'new' | literal )
;

postfixExpression : primaryExpression ( '++' | '--' )? ;

castExpression : '(' type ')' unaryExpression
|	'(' type ')' unaryExpressionNotPlusMinus
;

primaryExpression : primaryPrefix primarySuffix* ;

memberSelector : '.' typeArguments javaIdentifier ;

primaryPrefix : literal
|	'this'
|	'super' '.' javaIdentifier
|	'(' expression ')'
|	allocationExpression
|	resultType '.' 'class'
|	name
;

primarySuffix : '.' 'this'
|	'.' allocationExpression
|	memberSelector
|	'[' expression ']'
|	'.' javaIdentifier
|	arguments
;

literal : INTEGER_LITERAL
|	FLOATING_POINT_LITERAL
|	CHARACTER_LITERAL
|	STRING_LITERAL
|	booleanLiteral
|	nullLiteral
;

integerLiteral : INTEGER_LITERAL ;

booleanLiteral : 'true'
 | 'false'
 ;

stringLiteral : STRING_LITERAL ;

nullLiteral : 'null' ;

arguments : '(' argumentList? ')' ;

argumentList : expression ( ',' expression )* ;

allocationExpression : 'new' primitiveType arrayDimsAndInits
 |	'new' classOrInterfaceType typeArguments? ( arrayDimsAndInits | arguments classOrInterfaceBody? )
 ;

arrayDimsAndInits : ( '[' expression ']' )+ ( '[' ']' )*
 | ( '[' ']' )+ arrayInitializer
 ;

statement : labeledStatement
 | assertStatement
| block
|	emptyStatement_
|	statementExpression ';'
|	switchStatement
|	ifStatement
|	whileStatement
|	doStatement
|	forStatement
|	breakStatement
|	continueStatement
|	returnStatement
|	throwStatement
|	synchronizedStatement
|	tryStatement
;

assertStatement : 'assert' expression ( ':' expression )? ';' ;

labeledStatement : javaIdentifier ':' statement ;

block : '{' blockStatement* '}' ;

blockStatement : localVariableDeclaration ';'
 | statement
 | classOrInterfaceDeclaration
 ;

localVariableDeclaration : modifiers type variableDeclarator ( ',' variableDeclarator )* ;

emptyStatement_ : ';' ;

statementExpression : preIncrementExpression
 | preDecrementExpression
 | primaryExpression ( '++' | '--' | assignmentOperator expression )?
 ;

switchStatement : 'switch' '(' expression ')' '{' ( switchLabel ( blockStatement )* )* '}' ;

switchLabel : 'case' expression ':'
 | 'default' ':'
 ;

ifStatement : 'if' '(' expression ')' statement ( 'else' statement )? ;

whileStatement : 'while' '(' expression ')' statement ;

doStatement : 'do' statement 'while' '(' expression ')' ';' ;

forStatement : 'for' '(' ( modifiers type javaIdentifier ':' expression | ( forInit )? ';' ( expression )? ';' ( forUpdate )? ) ')' statement ;

forInit : localVariableDeclaration
 |	statementExpressionList
 ;

statementExpressionList : statementExpression ( ',' statementExpression )* ;

forUpdate : statementExpressionList ;

breakStatement : 'break' ( javaIdentifier )? ';' ;

continueStatement : 'continue' ( javaIdentifier )? ';' ;

returnStatement : 'return' expression? ';' ;

throwStatement : 'throw' expression ';' ;

synchronizedStatement : 'synchronized' '(' expression ')' block ;

resourceDeclaration : type variableDeclaratorId '=' expression ;

catchParameter : modifiers type ( ( '&' | '*' ) | '...' )? ( '|' type )* variableDeclaratorId ;

tryStatement : 'try' ( '(' resourceDeclaration ( ';' resourceDeclaration )* ( ';' )? ')' )? block ( 'catch' '(' catchParameter ')' block )* ( 'finally' block )? ;


annotation : normalAnnotation
 | singleMemberAnnotation
 | markerAnnotation
 ;

normalAnnotation : '@' name '(' memberValuePairs? ')' ;

markerAnnotation : '@' name ;

singleMemberAnnotation : '@' name '(' memberValue ')' ;

memberValuePairs : memberValuePair ( ',' memberValuePair )* ;

memberValuePair : javaIdentifier '=' memberValue ;

memberValue : annotation
  | memberValueArrayInitializer
  | conditionalExpression
  ;

memberValueArrayInitializer : '{' memberValue ( ',' memberValue )* ( ',' )? '}' ;

annotationTypeDeclaration : '@' 'interface' javaIdentifier annotationTypeBody ;

annotationTypeBody : '{' annotationTypeMemberDeclaration* '}' ;

annotationTypeMemberDeclaration : modifiers ( type javaIdentifier '(' ')' defaultValue? ';' | classOrInterfaceDeclaration | enumDeclaration | annotationTypeDeclaration | fieldDeclaration )
 | ';'
 ;

defaultValue : 'default' memberValue ;
